

from rest_framework.viewsets import ModelViewSet
from meiduo_admin.serializers.order_serializers import *
from meiduo_admin.custom_page import MyPage


class OrderModelViewSet(ModelViewSet):

    queryset = OrderInfo.objects.all()
    serializer_class = OrderSimpleModelSerializer
    pagination_class = MyPage

    def get_queryset(self):
        keyword = self.request.query_params.get('keyword')
        if not keyword:
            # keyword没有传值，或者是空字符串
            return self.queryset.all()

        return self.queryset.filter(
            order_id__contains=keyword
        )

    # 我们需要在retrieve这个视图方法中，指定序列化器
    # 在不同的视图方法中，定义使用不同的序列化器
    # 序列化返回订单列表数据 ---> self.list  -->  OrderSimpleModelSerializer
    # 序列化返回订单详情数据 ---> self.retrieve --> OrderDetailModelSerializer
    def get_serializer_class(self):
        """
        list和retrieve方法，都是通过get_serializer_class来获取序列化器
        在该函数里就可以根据视图函数的不同来指定返回的序列化器类
        """
        # 如果 视图函数是list：
        #     返回 默认序列化器OrderSimpleModelSerializer
        # 如果 视图函数是retrieve:
        #     返回 指定的序列化器OrderDetailModelSerializer

        # 焦点：如何判断处理当前请求的视图方法是什么呢？
        # 答：视图对象self,里面有一个属性self.action，该属性记录的就是：处理当前请求所使用的视图函数名称
        if self.action == 'list':
            return self.serializer_class
        if self.action == 'retrieve':
            return OrderDetailModelSerializer
        if self.action == 'partial_update':
            return OrderDetailModelSerializer



    # def retrieve(self, request, *args, **kwargs):
        # 1、根据pk过滤唯一订单
        # 2、构建序列化器对象
        #   -----> 默认使用的序列化器是self.serializer_class指定的序列化器
        #   -----> 默认序列化器是OrderSimpleModelSerializer
        #   -----> 在retrieve方法中使用的序列化器应该是OrderDetailModelSerializer
        # 抽放方法self.get_serializer()在构建序列化器对象的时候,
        # 使用self.get_serializer_class函数来获得序列化器类
        # 3 、序列化单一对象返回
        # pass